import java.util.HashMap;
import java.util.Map;

class Solution {
    public static int lengthOfLongestSubstring(String s) {
        int left = 0;
        int right = 0;
        int[] hash = new int[128]; // 根据ASCII码表来指定
        int count = 0;
        int len = 0;
        while (right < s.length()) {
            char ch = s.charAt(right);
            // 看哈希表中是否出现过这个元素
            if (hash[ch] == 0) {
                // 没出现就添加，再继续遍历
                hash[ch]++;
                right++;
                count++;
            } else {
                // 判断是否还有重复的元素
                while (hash[ch] != 0) {
                    len = Math.max(len, count); // 更新长度
                    hash[ch]--; // 删除元素(不一定是重复的)
                    count--; // 计数器--
                    ch = s.charAt(left++); // 遍历找寻重复的元素
                }
            }
        }
        // 同样也可能全部是不重复的
        len = Math.max(len, count);
        return len;
    }


    // public int lengthOfLongestSubstring(String s) {
    //     int left = 0;
    //     int right = 0;
    //     Map<Character, Integer> hash = new HashMap<>();
    //     int count = 0;
    //     int len = 0;
    //     while (right < s.length()) {
    //         char ch = s.charAt(right);
    //         // 看哈希表中是否出现过这个元素
    //         if (hash.getOrDefault(ch, 0) == 0) {
    //             // 没出现就添加，再继续遍历
    //             hash.put(ch, 1);
    //             right++;
    //             count++;
    //         } else {
    //             // 判断是否还有重复的元素
    //             while (hash.getOrDefault(ch, 0) != 0) {
    //                 len = Math.max(len, count); // 更新长度
    //                 hash.remove(ch); // 删除元素(不一定是重复的)
    //                 count--; // 计数器--
    //                 ch = s.charAt(left++); // 遍历找寻重复的元素
    //             }
    //         }
    //     }
    //     // 同样也可能全部是不重复的
    //     len = Math.max(len, count);
    //     return len;
    // }


    // public int lengthOfLongestSubstring(String s) {
    //     int left = 0;
    //     int right = 0;
    //     Map<Character, Integer> hash = new HashMap<>();
    //     int count = 0;
    //     int len = 0;
    //     while (right < s.length()) {
    //         char ch = s.charAt(right);
    //         // 看哈希表中是否出现过这个元素
    //         if (hash.getOrDefault(ch, 0) == 0) {
    //             // 没出现就添加，再继续遍历
    //             hash.put(ch, 1);
    //             right++;
    //             count++;
    //         } else {
    //             // 记录最长子串的长度，并更行count
    //             len = Math.max(count, len);
    //             count = 0;
    //             // right从头开始，哈希表中的元素也得清除
    //             right = ++left;
    //             hash.clear();
    //         }
    //     }
    //     // 可能出现没有重复的现象或者未被更新
    //     len = Math.max(count, len);
    //     return len;
    // }

    public static void main(String[] args) {
        lengthOfLongestSubstring("abcabcbb");
    }
}